package flyweight;

/**
 * 享元模式：摒弃在每个对象中保存全量数据的方式，通过共享多个对象所共有的相同状态，在有限容量内载入更多对象
 * 找出相似对象的共有特征，并复用这些特征
 *
 * 1. 享元类：定义享元对象需要实现的公共方法。方法需要一个外部状态，由客户端保存，在运行时变化
 * 2. 享元工厂：管理享元对象的缓存池，存储享元对象之间传递的内部状态，能够获取享元对象
 * 3. 可共享具体享元类：复用享元工厂内部状态并实现享元类公共操作
 * 4. 非共享具体享元类：不复用享元工厂状态，但实现享元类公共操作
 * =>
 * Integer.valueOf方法
 * 内部状态：不随环境变化的状态，不可变对象。如Integer的初始化缓存-128~127
 * 外部状态：随环境变化改变的状态，单个对象独有，不能被共享
 */
public class FlyweightTest {

    public static void main(String[] args) {
        FlyweightFactory factory = new FlyweightFactory();
        Flyweight A = factory.get("A");
        A.operation(1);

        Flyweight E = factory.get("E");
        E.operation(2);

        Flyweight E2 = factory.get("E");
        E2.operation(3);

        //非共享
        UnsharedConcreateFlyweight A2 = new UnsharedConcreateFlyweight("A");
        A2.operation(4);
    }


}
